﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using LCTNote.CustomObject;
using LCTNote.Models.ViewModels;
using LCTNote.Models.DataModels;
using LCTNote.Business;
using DevComponents.AdvTree;
using LCTNote.Services;

namespace LCTNote
{
    public partial class frmChinh : DevComponents.DotNetBar.Metro.MetroForm
    {
        /// <summary>
        /// Biến lưu mã người dùng đã đăng nhập
        /// </summary>
        int maNguoiDung;     

        public frmChinh()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {            
            //Đăng nhập
            dangNhap();

            //Lấy thu mục
            layThuMuc();

            //Ẩn 2 nút Lưu, Huỷ
            btnLuu.Visible = false;
            btnHuy.Visible = false;
            btnXoa.Visible = false;
        }

        /// <summary>
        /// Đăng nhập vào chương trình
        /// </summary>
        private void dangNhap()
        {
            frmDangNhap frmDangNhap = new frmDangNhap();
            if (frmDangNhap.ShowDialog() == DialogResult.OK)
            {
                //OK => xử lý
                //Lấy người dùng vừa đăng nhập
                maNguoiDung = frmDangNhap.layMaNguoiDungDangNhap();
            }
            else
            {
                //Đóng chương trình
                this.Close();
            }
        }

        /// <summary>
        /// Lấy thư mục của người dùng
        /// </summary>
        private void layThuMuc()
        {
            //Lấy cây thư mục của người dùng đưa vào cây thư mục
            Node nutThuMuc = ThuMucBusiness.layCayThuMuc(maNguoiDung);

            //Kiểm tra
            if (nutThuMuc == null)
            {
                MessageBox.Show("Lấy cây thư mục thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            //Đưa vào cây
            tvwCayThuMuc.Nodes.Add(nutThuMuc);

            //Chọn nút mặc định
            tvwCayThuMuc.SelectedIndex = 3;
        }

        #region Chọn thư mục
        /// <summary>
        /// Bắt sự kiện khi chọn vào nút ở cây thư mục
        /// Sau khi chọn sẽ hiển thị dữ liệu của thư mục đó
        /// </summary>
        private void tvwCayThuMuc_AfterNodeSelect(object sender, DevComponents.AdvTree.AdvTreeNodeEventArgs e)
        {
            //Kiểm tra xem nút được chọn có phải là 3 nút đầu tiên không
            //Nếu không thì lấy bản ghi, thư mục bên trong thư mục được chọn
            if (e.Node.Level == 0)
            {
                switch (e.Node.Index)
                {
                    case 0:
                        //Thư mục chứa bản ghi được ghim
                        break;
                    case 1:
                        //Thư mục chứa bản ghi có đặt thời gian
                        break;
                    case 2:
                        //Thư mục chứ các bản ghi gần đây
                        break;
                    default:
                        //Thư mục
                        hienThiDuLieuThuMuc((int)e.Node.Tag);
                        break;
                }                
            }
            else
            {
                //Thư mục
                hienThiDuLieuThuMuc((int)e.Node.Tag);
            }
        }

        /// <summary>
        /// Hiển thị danh sách dữ liệu của thư mục
        /// </summary>
        /// <param name="maThuMuc">Mã thư mục cần hiển thị</param>
        private void hienThiDuLieuThuMuc(int maThuMuc)
        {
            //Hiện/ẩn panel
            pnlThuMuc.Visible = true;
            pnlBanGhi.Visible = false;

            //Thay đổi thư mục hiện tại
            pnlThuMuc.Tag = maThuMuc;

            //Kiểm tra xem có phải nút gốc không
            if (maThuMuc == (int)tvwCayThuMuc.Nodes[3].Tag)
            {
                //Phải => Tắt nút quay lại
                btnThuMucTruoc.Enabled = false;
            }
            else
            {
                //Mở nút quay lại
                btnThuMucTruoc.Enabled = true;
            }

            //Xóa item hiện tại
            pnlThuMuc.Items.Clear();

            //Lấy dữ liệu của thư mục đưa vào panel
            LCTNote_TileItem[] items = ThuMucBusiness.layDuLieuThuMuc(maThuMuc, Tile_Click);
            
            //Kiểm tra
            if (items == null)
            {
                MessageBox.Show("Lấy dữ liệu thư mục thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            pnlThuMuc.Items.AddRange(items);
            pnlThuMuc.Refresh();
        }
        #endregion Chọn nút ở cây thư mục

        /// <summary>
        /// Bắt sự kiện khi người dùng chọn vào item ở bảng thư mục
        /// </summary>
        private void Tile_Click(object sender, EventArgs e)
        {
            LCTNote_TileItem item = sender as LCTNote_TileItem;
            
            switch(item.loai)
            {
                case 1:
                    //Thư mục
                    hienThiDuLieuThuMuc((int)item.Tag);
                    break;
                case 2:
                    //Bản ghi thường
                    hienThiDuLieuBanGhi((int)item.Tag);                    
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// Hiện thị thông tin bản ghi
        /// </summary>
        /// <param name="maBanGhi">Mã bản ghi hiển thị</param>
        private void hienThiDuLieuBanGhi(int maBanGhi)
        {
            //Lấy bản ghi
            BanGhiViewModel banGhi = BanGhiService.layBanGhiTheoMaBanGhi(maBanGhi);

            //Thay đổi ẩn/hiện panel
            pnlThuMuc.Visible = false;
            pnlBanGhi.Visible = true;

            //Lấy thông tin bản ghi
            pnlBanGhi.Tag = banGhi.ma;
            txtTieuDe.Text = banGhi.tieuDe;
            txtNoiDung.Text = banGhi.noiDung;
        }

        #region Editor
        private void btnBold_Click(object sender, EventArgs e)
        {
            toggleFontBoldItem1.PerformClick();
        }

        private void btnItalic_Click(object sender, EventArgs e)
        {
            toggleFontItalicItem1.PerformClick();
        }

        private void btnUnderline_Click(object sender, EventArgs e)
        {
            toggleFontUnderlineItem1.PerformClick();
        }

        private void btnTextColor_Click(object sender, EventArgs e)
        {
            changeFontColorItem1.PerformClick();
        }

        private void btnNumeric_Click(object sender, EventArgs e)
        {
            toggleNumberingListItem1.PerformClick();
        }

        private void btnBulleted_Click(object sender, EventArgs e)
        {
            toggleBulletedListItem1.PerformClick();
        }

        private void btnIndent_Click(object sender, EventArgs e)
        {
            increaseIndentItem1.PerformClick();
        }

        private void btnOutdent_Click(object sender, EventArgs e)
        {
            decreaseIndentItem1.PerformClick();
        }

        private void btnLeft_Click(object sender, EventArgs e)
        {
            toggleParagraphAlignmentLeftItem1.PerformClick();
        }

        private void btnCenter_Click(object sender, EventArgs e)
        {
            toggleParagraphAlignmentCenterItem1.PerformClick();
        }

        private void btnRight_Click(object sender, EventArgs e)
        {
            toggleParagraphAlignmentRightItem1.PerformClick();
        }

        private void btnJustify_Click(object sender, EventArgs e)
        {
            toggleParagraphAlignmentJustifyItem1.PerformClick();
        }
        #endregion Editor

        #region Tab chức năng
        /// <summary>
        /// Tạo thư mục
        /// </summary>
        private void btnTaoThuMuc_Click(object sender, EventArgs e)
        {
            //Nhập thông tin thư mục
            frmTaoThuMuc frm = new frmTaoThuMuc();            
            if (frm.ShowDialog() == DialogResult.OK)
            {
                //Nếu OK => lấy thư mục và thêm
                ThuMucDataModel thuMuc = frm.layThuMuc();
                thuMuc.maNguoiTao = maNguoiDung;
                thuMuc.maThuMucCha = (int)pnlThuMuc.Tag;

                //Thêm và kiểm tra
                int maThuMuc = ThuMucBusiness.themThuMuc(thuMuc);
                if (maThuMuc == 0)
                {
                    //Thất bại
                    MessageBox.Show("Thêm thư mục thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    //Thành công
                    pnlThuMuc.Items.Add(new LCTNote_TileItem(maThuMuc, 1, thuMuc.tenThuMuc, thuMuc.moTaThuMuc, Tile_Click), 0);
                    pnlThuMuc.Refresh();

                    //Thêm nút trong cây thư mục
                    themNut(maThuMuc);
                }
            }
        }

        /// <summary>
        /// Tạo bản ghi mới
        /// </summary>
        private void btnTaoGhiChu_Click(object sender, EventArgs e)
        {                      
            //Thay đổi ẩn/hiện panel
            pnlThuMuc.Visible = false;
            pnlBanGhi.Visible = true;

            //Gán nội dung
            txtTieuDe.Text = "Nhập tiêu đề...";
            txtNoiDung.Text = "Nhập nội dung...";

            //Lấy mã bản ghi = 0 => tạo mới
            pnlBanGhi.Tag = 0;
        }

        /// <summary>
        /// Quay lui
        /// </summary>
        private void btnThuMucTruoc_Click(object sender, EventArgs e)
        {
            //Lấy mã thư mục cha của thư mục hiện tại
            try
            {
                int maThuMucCha = ThuMucBusiness.layThuMucTheoMaThuMuc((int)pnlThuMuc.Tag).maThuMucCha;

                //Hiển thị
                hienThiDuLieuThuMuc(maThuMucCha);
            }
            catch
            {
                //Lỗi vì lấy thư mục thất bại
                MessageBox.Show("Lấy thư mục cha thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return;
            }
        }
        #endregion Tab chức năng

        #region Xử lý thêm, xóa nút trong cây thư mục
        /// <summary>
        /// Thêm nút vào cây
        /// </summary>
        /// <param name="maThuMuc">Mã thư mục cần thêm</param>
        private void themNut(int maThuMuc)
        {
            //Lấy thư mục
            ThuMucViewModel thuMuc = ThuMucBusiness.layThuMucTheoMaThuMuc(maThuMuc);
            
            //Kiểm tra
            if (thuMuc == null)
            {
                MessageBox.Show("Lấy thư mục thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);                
                return;
            }

            //Tìm nút
            Node nut = timNut(tvwCayThuMuc.Nodes[3], thuMuc.maThuMucCha);

            //Kiểm tra xem có tìm được hay không
            if (nut == null)
            {
                MessageBox.Show("Không tìm thấy nút phù hợp", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);    
                return;
            }

            //Thêm nút con vào nút tìm được
            Node nutCon = new Node(thuMuc.tenThuMuc);
            nutCon.Tag = thuMuc.ma;
            nutCon.ImageIndex = 0;
            nutCon.ImageExpandedIndex = 1;
            nut.Nodes.Add(nutCon);
        }
        /// <summary>
        /// Đệ qui tìm nút có mã thư mục truyền vào
        /// </summary>
        /// <param name="nut">Nút được xét</param>
        /// <param name="maThuMuc">Mã thư mục cần tìm</param>
        private Node timNut(Node nut, int maThuMuc)
        {
            if ((int)nut.Tag == maThuMuc)
            {
                return nut;
            }
            
            //Chạy toàn bộ
            foreach (Node nutCon in nut.Nodes)
            {                
                //Đệ qui tìm trong nút con
                Node ketQua = timNut(nutCon, maThuMuc);

                //Nếu kết quả != null => tìm được => trả về
                if (ketQua != null)
                {
                    return ketQua;
                }
            }
            //Trả về null nếu không tìm được
            return null;
        }
        #endregion Xử lý thêm, xóa nút trong cây thư mục

        #region Xử lý sự kiện các textbox
        /// <summary>
        /// Bắt sự kiện click
        /// Nếu text đang là ... thì xóa
        /// </summary>
        private void txtTieuDe_MouseClick(object sender, MouseEventArgs e)
        {
            if (txtTieuDe.Text == "Nhập tiêu đề...")
            {
                txtTieuDe.Text = "";
            }
        }

        /// <summary>
        /// Bắt sự kiện click
        /// Nếu text đang là ... thì xóa
        /// </summary>
        private void txtNoiDung_Click(object sender, EventArgs e)
        {
            if (txtNoiDung.Text == "Nhập nội dung..." || txtNoiDung.WordMLText == "Nhập nội dung...")
            {
                txtNoiDung.Text = "";
                txtNoiDung.WordMLText = "";
            }
        }
        #endregion

        /// <summary>
        /// Bắt sự kiện click của nút lưu bản ghi
        /// </summary>
        private void btnLuu_Click(object sender, EventArgs e)
        {
            //Kiểm tra rỗng
            if (txtTieuDe.Text == "")
            {
                MessageBox.Show("Vui lòng nhập tiêu đề!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (txtNoiDung.Text == "")
            {
                MessageBox.Show("Vui lòng nhập nội dung!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                //Lấy thông tin bản ghi
                BanGhiDataModel banGhi = new BanGhiDataModel();
                banGhi.noiDung = txtNoiDung.Text;
                banGhi.noiDungDinhDang = txtNoiDung.WordMLText;
                banGhi.chuoiMaTuKhoa = "";
                banGhi.thoiGianCapNhat = DateTime.Now;
                banGhi.chuoiMaTapTin = "";
                banGhi.maThuMuc = (int)pnlThuMuc.Tag;
                banGhi.tieuDe = txtTieuDe.Text;
                banGhi.thoiGianBao = DateTime.Now;
                banGhi.Ghim = false;
                banGhi.maNguoiTao = maNguoiDung;

                //Kiểm tra nếu Tag == 0 => bản ghi mới
                if ((int)pnlBanGhi.Tag == 0)
                {
                    if (BanGhiBusiness.themBanGhi(banGhi))
                    {
                        MessageBox.Show("Lưu bản ghi thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Lưu bản ghi thất bại!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    //Gán mã bản ghi hiện tại để cập nhật
                    banGhi.ma = (int)pnlBanGhi.Tag;

                    if (BanGhiBusiness.capNhatBanGhi(banGhi))
                    {
                        MessageBox.Show("Cập nhật bản ghi thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Cập nhật bản ghi thất bại!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        /// <summary>
        /// Bắt sự kiện khi nhấn nút hủy
        /// </summary>
        private void btnHuy_Click(object sender, EventArgs e)
        {
            txtTieuDe.Text = "Nhập tiêu đề...";
            txtTieuDe.Focus();

            txtNoiDung.Text = "Nhập nội dung...";            
        }

        /// <summary>
        /// Bắt sự kiện khi panel bản ghi thay đổi ẩn/hiện
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pnlBanGhi_VisibleChanged(object sender, EventArgs e)
        {
            if (pnlBanGhi.Visible)
            {
                //Hiện
                btnLuu.Visible = true;
                btnHuy.Visible = true;
                btnXoa.Visible = true;
                vrChucNangBanGhi.Visible = true;
                tabDinhDang.Visible = true;
                btnThuMucTruoc.Visible = false;
                vrThuMucTruoc.Visible = false;
            }
            else
            {
                //Ẩn
                btnLuu.Visible = false;
                btnHuy.Visible = false;
                btnXoa.Visible = false;
                vrChucNangBanGhi.Visible = false;
                tabDinhDang.Visible = false;
                btnThuMucTruoc.Visible = true;
                vrThuMucTruoc.Visible = true;
                tabChucNang.RaiseClick();
            }
            menuBar.Refresh();
        }

        /// <summary>
        /// Bắt sự kiện nút xóa
        /// </summary>
        private void btnXoa_Click(object sender, EventArgs e)
        {                        
            if (BanGhiBusiness.xoaBanGhi((int)pnlBanGhi.Tag))
            {
                MessageBox.Show("Xoá bản ghi thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("Xoá bản ghi thất bại!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }        
    }
}